#include "app_router.h"
#include "log/log.h"
#include "app_mqtt.h"
#include "app_message.h"
#include <stdlib.h>

#define MAX_DEVICE_NUM 10
static Device *device_list[MAX_DEVICE_NUM];
static int device_count = 0;

/**
 * 发送消息
 */
static int router_send_msg(Device *device, char *data, int len)
{
    // 将data数据转化为json格式
    Message *message = app_message_initByBinary(data, len);
    char json[128];
    int len = app_message_toJson(message, json, sizeof(json));

    // 发送消息到服务器
    app_mqtt_send(json, len);
    // 释放消息
    app_message_free(message);
    return 0;
}

static int router_recv_callback(char *json, int len)
{
    Message *message = app_message_initByJson(json);
    // 查找对应的设备
    for (int i = 0; i < device_count; i++)
    {
        // 当前是通过连接类型来匹配设备
        if (message->conn_type == device_list[i]->conn_type)
        {
            // 将message转换成二进制数据
            char binary[128];
            app_message_toBinary(message, binary, sizeof(binary));
            int result = app_device_recvMessage(device_list[i], binary, sizeof(binary));
            free(message);
            return result;
        }
    }
    log_error("no device match");

    return -1;
}

int app_router_init(void)
{
    // 初始化mqtt客户端
    app_mqtt_init();

    // 注册接收消息的回调函数
    app_mqtt_registRecvCallback(router_recv_callback);
    return 0;
}

void app_router_close(void)
{
    // 关闭mqtt连接
    app_mqtt_close();
    // 停止并关闭所有注册的设备
    for (int i = 0; i < device_count; i++)
    {
        app_device_stop(device_list[i]);
        app_device_close(device_list[i]);
    }
}

int app_router_register_device(Device *device)
{
    // 如果设备数量超过最大值，则返回错误
    if (device_count >= MAX_DEVICE_NUM)
    {
        log_error("device count exceed max device num");
        return -1;
    }
    // 将设备添加到设备列表中
    device_list[device_count++] = device;
    // 给设备指定实现发送消息的函数
    device->funs->send_msg =
        // 启动设备
        app_device_start(device);

    return 0;
}
